<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>async&await</title>
</head>

<body>
  <script>
    'use strict'
    onload = function () {
      /* 
        async&await 介绍
          1.async&await 是异步编程问题的终极解决方案，将异步代码以同步的形式表达出来
          2.async 用于将一个函数修饰成一个 Promise 实例，await 用于等待一个 Promise 实例执行

        async 返回值
          1.默认返回一个成功状态的 Promise 实例，值为函数 return 的返回值(如果返回值为一个 Promise 实例，async 返回的 Promise 实例和它保持一致)
          2.当 async 中 await 等待的 Promise 实例为失败的，async 返回一个失败状态的 Promise 实例，值为 await 等待的失败的 Promise 实例的值
          3.当 async 中有异常抛出但未处理，async 返回一个失败状态的 Promise 实例，值为错误信息对象
      
        await 的使用及返回值
          1.await 只能等待 Promise 实例，其他都不等(await Promise; 语句后的代码都变为异步代码)
          2.当 await 等待的 Pomise 实例状态变为成功时，返回 Promise 成功的结果，后面的代码继续指向
          3.当 await 等待的 Pomise 实例状态变为失败时，直接退出当前 async 函数
      */

      /* const promise = async () => {
        return 123
      }

      console.dir(promise()) */

      function A() {
        return new Promise((resolve, reject) => {
          try {
            // 模拟请求
            setTimeout(() => {
              resolve({
                username: 'admin'
              })
            }, 2000)
          } catch (error) {
            reject(error)
          }
        })
      }

      function B(value) {
        return new Promise((resolve, reject) => {
          try {
            // 模拟异常
            throw new Error('数据B请求异常')
            // 模拟请求
            setTimeout(() => {
              resolve({
                ...value,
                email: '123456@qq.com'
              })
            }, 2000)
          } catch (error) {
            reject(error)
          }
        })
      }

      const promise = async () => {
        const result = await A()
        return await B(result)
      }

      promise().then(value => {
        console.log(value)
      }).catch(reason => {
        console.log(reason)
      })

      //console.dir(promise)
    }
  </script>
</body>

</html>